﻿#import os
#import sys




# Настройка вывода ошибок в файл

# Определяется текущая директория

#__dir__ = os.path.dirname(os.path.abspath(__file__))
#path_error = os.path.join(__dir__, "so_test_error.log")

# Вывод ошибок перенаправляется в файл error.log в текущей директории

#sys.stderr = open(path_error, 'a')

from dbnew1 import base as superbase
from dbnew1 import view as superview
from dbnew1 import aview as superaview
from dbnew1 import relations as superrelations
import fdb

class base(superbase):
	"This class is a firebird connector"
	#print (self.__doc__)
	#beginning of class suite
	def __init__(self):
		super(base, self).__init__()
		self.driver=fdb
		self.user='sysdba'
		self.passwd='imech'
		self.host='sa-fs7.tb.local'
		self.base='C:\IM_SW\Search\DB\SEARCH4.GDB'
	
	def open(self):
		"This function opens connection to base"
		#print (self.open.__doc__)
		#beginning of function suite
		self.conn = self.driver.connect(host=self.host, database=self.base, user=self.user, password=self.passwd)
		self.cursor = self.conn.cursor()
		return

class relations(superrelations):
		"This class counts and select records for fdb relations"
		#beginning of class suite
		#print (self.__doc__)
		#Инициализация:
		def __init__(self):
			super(relations, self).__init__()
			self.base=base()
			self.variable='?'

		def catalogue(self, type):
			return 'RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE IN '+type

		def field(self, type):
			return ' AND '+'TRIM(RDB$RELATION_NAME)'
		
		def type(self,type):
			'Function returns base specific type sign'
			dict={'t':'(0)','v':'(1)','a':'(0,1)'}
			return dict[type]

		def executer(self, string, variable=None):
			#Выполняется транзакция
			if not variable:
				self.base.cursor.execute(string)
			else:
				self.base.cursor.execute(string, [variable])
			#Функция возвращает результат запроса
			return self.base.cursor.fetchall()

		#Определяется функция выборки похожих таблиц и видов
		def SelectlikeAny(self,names=['']):
			'''Function selects like any'''
			#beginning of function suite
			#print(self.SelectlikeAny.__doc__)
			#end of function suite
			#Функция возвращает выборку таблиц и видов с похожими именами
			return self.selectlike(self.type('a'),names)

		#Определяется функция выборки таблиц и видов
		def SelectAny(self,names=['']):
			'''Function selects any'''
			#beginning of function suite
			#print(self.SelectAny.__doc__)
			#end of function suite
			#Функция возвращает выборку таблиц и видов с заданными именами
			return self.select(self.type('a'),names)
		
		#Определяется функция подсчета количества похожих таблиц и видов
		def CountlikeAny(self,names=['']):
			'''Function counts any'''
			#beginning of function suite
			#print(self.CountlikeAny.__doc__)
			#end of function suite
			#Функция возвращает число таблиц и видов с похожим именами
			return self.countlike(self.type('a'),names)
		
		#Определяется функция подсчета количества таблиц и видов
		def CountAny(self,names=['']):
			'''Function counts any'''
			#beginning of function suite
			#print(self.CountAny.__doc__)
			#end of function suite
			#Функция возвращает число таблиц и видов с заданными именами
			return self.count(self.type('a'),names)

	#end of class relations suite

class view(superview):
	"This class is to manipulate view in firebird"
	#beginning of class suite
	#print (self.__doc__)
	#Инициализация:
	def __init__(self):
		super(view, self).__init__()
		self.base=base()
		self.relations=relations()

	def SqlName(self, name):
		"Function returns sql string for the view name"
		return 'X_OASUP_SO_'+name
	
	def SqlFields(self, fields):
		"Function returns sql string for the view fields"
		return ' '+'('+', '.join(fields)+')'

	#end of class view suite

class aview(superaview):
	"This class is a manipulator for a view in firebird"
	#beginning of class suite
	#print (self.__doc__)
	def __init__(self):
		super(aview, self).__init__()
		self.view=view()

	#Определяется функция подсчета количества видов с данным именем
	def count(self):
		return self.view.count(self.name)
		
	#Определяется функция создания вида
	def create(self):
		return self.view.create(self.name, self.fields, self.query, self.param)
		
	#Определяется функция уничтожения вида
	def drop(self):
		return self.view.drop(self.name)

	#Заменяется родительская функция
	def SqlName(self):
		"Function returns sql string for the view name"
		return self.view.SqlName(self.name)
	
	#Заменяется родительская функция
	def SqlFields(self):
		"Function returns sql string for the view fields"
		return self.view.SqlFields(self.name)
		
	#Заменяется родительская функция
	def SqlCreate(self):
			"Function returns sql string for the view create query"
			return self.view.SqlCreate(self.name, self.fields, self.query, self.param)
	
	#Заменяется родительская функция
	def SqlDrop(self, name):
			"Function returns sql string for the view drop query"
			return self.view.SqlDrop(self.name)

	#end of class suite




#Вывод ошибок возвращается "в исходное положение"

#sys.stderr.close()
#sys.stderr = sys.__stderr__